perm filename OSA.RSX[11,HE] blob sn#656312 filedate 1982-04-29 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
	.TITLE	OSA
	.DSABL	GBL
	.MCALL	EXIT$S,MRKT$S,ASTX$S

	.CSECT	GLOBAL
G=.
.=G+2.+2.
	.WORD	STOP
.=G+100.+100.
	.WORD	MOVBLK
	.WORD	ZERO
	.WORD	0
	.WORD	NOOP
	.WORD	SETBLK
	.WORD	CLLSWT
	.WORD	SYSERR
	.WORD	USC
	.WORD	GETFIX
	.WORD	FIXLFT

	.CSECT

DYNSIZ=6500.
STKSIZ=100.
START=G+1.+1.
BINCLK=G+135.+135.

;
;ENTRY POINT FOR ALL BCPL PROGRAMS
;
ENTRY::
	MRKT$S	,#6,#1,#MKTIME	;MARK TIME = 100 MSEC.(6 TICKS)
	MOV	#STKSIZ,R1	;GET 100 WORDS FOR BCPL STACK
	JSR	PC,GETFIX
	.WORD	0
	TST	R1		;DID I GET IT?
	BNE	ENTOK		;YES, BRANCH
	JSR	PC,SYSERR	;NO, HALT
	.WORD	0
ENTOK:
	ASL	R1		;CONVERT POINTER TO ADDRESS
	ADD	#2*STKSIZ,R1	;CALCULATE TOP OF STACK
	MOV	R1,R0		;R0 = STACK POINTER
;
;EXECUTE BCPL MAIN PROGRAM
;
	JSR	PC,@START	;EXECUTE MAIN PROGRAM
	.WORD	0
;
;EXIT POINT FOR BCPL PROGRAMS - MAIN PROGRAM RETURNS HERE
;
STOP::
	EXIT$S
	.PAGE
;
;MARK TIME ROUTINE ENTERED EVERY 100 MSEC
;
MKTIME:
	TST	(SP)+		;POP EVENT FLAG NUMBER
	INC	BINCLK		;UPDATE BINARY CLOCK
	MRKT$S	,#6,#1,#MKTIME
	BCS	MKTIM1
	ASTX$S			;RETURN
MKTIM1:
	HALT
	.PAGE
;
;SUBROUTINE MoveBlock(dest,src,count)
;
MOVBLK::
	ASL	R1		;CONVERT POINTERS
	ASL	R2		;	TO ADDRESSES
MVBLK1:
	MOV	(R2)+,(R1)+
	SOB	R3,MVBLK1
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE Zero(dest,count)
;
ZERO::
	ASL	R1		;CONVERT POINTER TO ADDRESS
ZERO1:
	CLR	(R1)+
	SOB	R2,ZERO1
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE Noop()
;
NOOP::
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE SetBlock(dest,value,count)
;
SETBLK::
	ASL	R1		;CONVERT POINTER TO ADDRESS
STBLK1:
	MOV	R2,(R1)+
	SOB	R3,STBLK1
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE CallSwat()
;
CLLSWT::
	HALT
;
;SUBROUTINE SysErr()
;
SYSERR::
	JSR	PC,CLLSWT
;
;SUBROUTINE Usc(a,b) = 1/0/-1
;
USC::
	CMP	R1,R2
	BEQ	USCEQ
	BHI	USCHI
	MOV	#-1,R1
	BR	USCEX
USCEQ:
	CLR	R1
	BR	USCEX
USCHI:
	MOV	#1,R1
USCEX:
	ADD	#2,@SP
	RTS	PC		;RETURN
	.PAGE
;
;SUBROUTINE GetFixed(nWords) = pointer or 0
;

GETFIX::
	MOV	R1,R2		;SAVE NWORDS
	MOV	SIZ,R1		;NWORDS LEFT
	CMP	R1,R2		;FEWER THAN REQUESTED?
	BLO	GETNO		;YES, BRANCH
	MOV	TOP,R1		;NO, RETURN ADDRESS
	CLC			;	AS POINTER
	ROR	R1		;
	SUB	R2,SIZ		;UPDATE SIZ
	ASL	R2		;CONVERT NWORDS TO BYTES
	ADD	R2,TOP		;UPDATE TOP
	BR	GETEX
GETNO:
	CLR	R1		;RETURN ZERO
GETEX:
	ADD	#2,@SP		;RETURN
	RTS	PC
;
;SUBROUTINE FixedLeft() = nWords
;
FIXLFT::
	MOV	SIZ,R1		;NWORDS LEFT
	ADD	#2,@SP		;RETURN
	RTS	PC
;
SIZ:	.WORD	DYNSIZ		;SIZE OF UNUSED BLOCK (WORDS)
DYN::	.BLKW	DYNSIZ		;MEMORY BLOCK
TOP::	.WORD	DYN		;LOC OF UNUSED BLOCK (BA)
	.END	ENTRY